package com.jch.string_decoder;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;

import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;

// 读取接收到数据，发送反馈数据
public class SendAndReadHandler extends ChannelInboundHandlerAdapter {

    // 当客户端连接服务端成功后，该通道就处于活跃状态。即客户端与服务端建立了通道并且可以传输数据了。
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketChannel channel = (SocketChannel) ctx.channel();
        System.out.println("连接信息：");
        System.out.println("有一个客户端接入");
        System.out.println("IP: " + channel.localAddress().getHostString());
        System.out.println("PORT: " + channel.localAddress().getPort());
        System.out.println("连接信息end");

        // 通知客户端连接建立成功
        String msg = "连接成功：" + new Date() + " " + channel.localAddress().getHostString() + "\r\n";
        ByteBuf buf = Unpooled.buffer(msg.getBytes().length);
        buf.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
        ctx.writeAndFlush(buf);
    }

    // 客户端主动断开服务端连接后，该通道处于不活跃状态。即客户端与服务端关闭了通信通道并且不可以传输数据了。
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端断开连接：" + ctx.channel().localAddress().toString());
    }

    // 读取客户端发送的数据
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 使用字符串解码器，此处不用自己解码。可直接使用
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "收到消息：" + msg + "\r\n");
        // 告知客户端消息发送成功
        String strMsg = "服务端收到：" + new Date() + " " + msg + "\r\n";
        ByteBuf buf = Unpooled.buffer(strMsg.getBytes().length);
        buf.writeBytes(strMsg.getBytes(StandardCharsets.UTF_8));
        // 写入并刷新通道
        ctx.writeAndFlush(buf);
    }

    // 发生异常时调用
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 关闭通道
        ctx.close();
        System.out.println("异常信息：\r\n" + cause.getMessage());
    }
}
